import { useMemo, useState, useRef } from 'react';

/**
 * @description 针对于那些受控组件的默认值进行转化，避免父组件重渲染导致传入的默认值的引用改变，导致副作用不必要的执行
 * @return string
 */
export const useParseValue = (value?: string | number | Array<string | number>) => {
    const parsedValue = useMemo(() => {
        if (Array.isArray(value)) return value;

        return [value];
    }, [value]);

    return parsedValue.toString();
};

/**
 * @description 针对于组件需要依据透传下来的数据进行重新设置的副作用，较于useEffect，他的执行时机在渲染期间而不是渲染之后，是同步的
 * @return void
 */
export const useSyncEffect = (effect: React.EffectCallback, dep: any) => {
    const [preDep, setPreDep] = useState(dep);
    const initialized = useRef(true);

    if (initialized.current) {
        effect();
        initialized.current = false;
    }

    if (preDep !== dep) {
        effect();
        setPreDep(dep);
    }
};
